home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume11 / tgif / patch6.03 < prev    next >
Encoding:
Internet Message Format  |  1991-02-12  |  44.4 KB

  1. Path: uunet!bellcore!att!linac!uwm.edu!lll-winken!sun-barr!newstop!exodus!CS.UCLA.EDU
  2. From: william@CS.UCLA.EDU (William Cheng)
  3. Newsgroups: comp.sources.x
  4. Subject: v11i065: tgif, Patch6, Part03/06
  5. Message-ID: <7935@exodus.Eng.Sun.COM>
  6. Date: 13 Feb 91 07:31:04 GMT
  7. References: <csx-11i063:tgif@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1540
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: william@CS.UCLA.EDU (William Cheng)
  13. Posting-number: Volume 11, Issue 65
  14. Archive-name: tgif/patch6.03
  15. Patch-To: Volume 7, Issue 56-76 (original: tgif-1.2)
  16. Patch-To: Volume 8, Issue 46-48 (Patch1: tgif-1.2 => tgif-1.9)
  17. Patch-To: Volume 8, Issue 58-60 (Patch2: tgif-1.9 => tgif-1.12)
  18. Patch-To: Volume 8, Issue 87-89 (Patch3: tgif-1.12 => tgif-1.13)
  19. Patch-To: Volume 8, Issue 94 (Patch4: tgif-1.13 => tgif-1.14)
  20. Patch-To: Volume 8, Issue 95 (Patch5: tgif-1.14 => tgif-1.15)
  21.  
  22. ---------------------------------> cut here <---------------------------------
  23. *** names.c.orig    Wed Dec 12 14:36:02 1990
  24. --- names.c    Wed Dec 12 14:36:07 1990
  25. ***************
  26. *** 6,10 ****
  27.   #ifndef lint
  28.   static char RCSid[] =
  29. !       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/names.c,v 1.6 90/07/27 14:39:29 william Exp $";
  30.   #endif
  31.   
  32. --- 6,10 ----
  33.   #ifndef lint
  34.   static char RCSid[] =
  35. !       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/names.c,v 1.18 90/11/09 15:06:52 william Exp $";
  36.   #endif
  37.   
  38. ***************
  39. *** 20,23 ****
  40. --- 20,24 ----
  41.   #include "button.e"
  42.   #include "cursor.e"
  43. + #include "file.e"
  44.   #include "font.e"
  45.   #include "mainloop.e"
  46. ***************
  47. *** 33,37 ****
  48. --- 34,50 ----
  49.   #define ROW_HEIGHT (defaultFontHeight+1)
  50.   
  51. + typedef struct _DspList {
  52. +    char            itemstr[MAXPATHLENGTH+1];
  53. +    char            pathstr[MAXPATHLENGTH+1];
  54. +    int            directory;
  55. +    struct _DspList    * next;
  56. + } DspList;
  57. + extern char    * getenv ();
  58.   char    curDomainName[MAXPATHLENGTH];
  59. + char    curDomainPath[MAXPATHLENGTH];
  60. + char    curDir[MAXPATHLENGTH];
  61. + char    curSymDir[MAXPATHLENGTH];
  62.   
  63.   static Window        nameBaseWin;
  64. ***************
  65. *** 55,61 ****
  66.   static GC    revNameGC;
  67.   
  68.   void InitNames ()
  69.   {
  70. !    char        * c_ptr;
  71.      XGCValues    values;
  72.   
  73. --- 68,343 ----
  74.   static GC    revNameGC;
  75.   
  76. + static DspList    * symbolList = NULL;
  77. + static int    numSymbols;
  78. + static DspList    * dirList = NULL;
  79. + static int    numDirEntries;
  80. + static DspList    * topOfSymLinkList = NULL;
  81. + static DspList    * topOfDirLinkList = NULL;
  82. + static
  83. + char * ReadPath (path_str, dir_str)
  84. +    char * path_str, * dir_str;
  85. + {
  86. +    register char        * s1, * s2;
  87. +    s1 = path_str;
  88. +    if (*s1 == '~')
  89. +    {
  90. +       strcpy (dir_str, homeDir);
  91. +       s2 = &dir_str[strlen(dir_str)];
  92. +       s1++;
  93. +    }
  94. +    else
  95. +       s2 = dir_str;
  96. +    for ( ; *s1 != '\0' && *s1 != ':'; s1++)
  97. +       if (*s1 == '\\')
  98. +          strcpy (s1, s1+1);
  99. +       else
  100. +          *s2++ = *s1;
  101. +    *s2 = '\0';
  102. +    if (*s1 == ':') s1++;
  103. +    return (s1);
  104. + }
  105. + void ParseSymPath (path_str)
  106. +    char * path_str;
  107. + {
  108. +    register char        * s, c;
  109. +    register int         i;
  110. +    char                 dir_str[MAXPATHLENGTH];
  111. +    for (i = 0, s = path_str; *s != '\0'; )
  112. +    {
  113. +       s = ReadPath (s, dir_str);
  114. +       if (dir_str != '\0') i++;
  115. +    }
  116. +    symPath = (char * *) calloc (i, sizeof (char *));
  117. +    symPathNumEntries = i;
  118. +    for (i = 0, s = path_str; *s != '\0'; )
  119. +    {
  120. +       s = ReadPath (s, dir_str);
  121. +       if (dir_str != '\0')
  122. +       {
  123. +          symPath[i] = (char *) calloc (MAXPATHLENGTH, sizeof (char));
  124. +          strcpy (symPath[i], dir_str);
  125. +          i++;
  126. +       }
  127. +    }
  128. +    strcpy (curDomainPath, path_str);
  129. + }
  130. + static
  131. + DspList * SymbolListing ()
  132. + {
  133. +    int            i, len, path_index, count = 0, reject;
  134. +    char            path[MAXPATHLENGTH], s[MAXPATHLENGTH];
  135. +    DspList        * dsp_ptr = NULL, * head_ptr, * tail_ptr, * p, * p1;
  136. +    DIR            * dirp;
  137. +    struct direct    * d;
  138. +    struct stat        stat_buf;
  139. +    head_ptr = tail_ptr = NULL;
  140. +    for (path_index = 0; path_index < symPathNumEntries; path_index++)
  141. +    {
  142. +       strcpy (path, symPath[path_index]);
  143. +       if (strcmp (".", path) == 0) strcpy (path, curDir);
  144. +       if ((dirp = opendir (path)) == NULL)
  145. +          continue;
  146. +       while ((d = readdir (dirp)) != NULL)
  147. +       {
  148. +          len = strlen (d->d_name);
  149. +          if (len > 4 && (strcmp (".sym", &d->d_name[len-4]) == 0))
  150. +             d->d_name[len-4] = '\0';
  151. +          else
  152. +             continue;
  153. +          if (head_ptr == NULL)
  154. +          {
  155. +             head_ptr = tail_ptr = (DspList *) calloc (1, sizeof(DspList));
  156. +             strcpy (head_ptr->itemstr, d->d_name);
  157. +             strcpy (head_ptr->pathstr, path);
  158. +          }
  159. +          else
  160. +          {
  161. +             p1 = NULL;
  162. +             reject = FALSE;
  163. +             for (p = head_ptr; p != NULL; p = p->next)
  164. +             {
  165. +                if (strcmp (d->d_name, p->itemstr) == 0)
  166. +                {
  167. +                   reject = TRUE;
  168. +                   break;
  169. +                }
  170. +                else if (LargerStr (d->d_name, p->itemstr))
  171. +                   p1 = p;
  172. +                else
  173. +                {
  174. +                   dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  175. +                   strcpy (dsp_ptr->itemstr, d->d_name);
  176. +                   strcpy (dsp_ptr->pathstr, path);
  177. +                   break;
  178. +                }
  179. +             }
  180. +             if (reject) continue;
  181. +    
  182. +             dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  183. +             dsp_ptr->next = p;
  184. +             strcpy (dsp_ptr->itemstr, d->d_name);
  185. +             strcpy (dsp_ptr->pathstr, path);
  186. +             if (p == NULL)
  187. +             {  /* dsp_ptr has the largest element */
  188. +                tail_ptr->next = dsp_ptr;
  189. +                tail_ptr = dsp_ptr;
  190. +             }
  191. +             else if (p1 == NULL)
  192. +                head_ptr = dsp_ptr;
  193. +             else
  194. +                p1->next = dsp_ptr;
  195. +          }
  196. +          count++;
  197. +       }
  198. +       closedir (dirp);
  199. +    }
  200. +    numSymbols = count;
  201. +    return (head_ptr);
  202. + }
  203. + static
  204. + void BuildSymbolList ()
  205. + {
  206. +    register int        i;
  207. +    register DspList    * dsp_ptr;
  208. +    if (symbolList != NULL) cfree (symbolList);
  209. +    symbolList = (DspList *) calloc (numSymbols, sizeof (DspList));
  210. +    dsp_ptr = topOfSymLinkList;
  211. +    for (i = 0; i < numSymbols; i++, dsp_ptr = dsp_ptr->next)
  212. +    {
  213. +       strcpy (symbolList[i].itemstr, dsp_ptr->itemstr);
  214. +       strcpy (symbolList[i].pathstr, dsp_ptr->pathstr);
  215. +       symbolList[i].next = &symbolList[i+1];
  216. +       cfree (dsp_ptr);
  217. +    }
  218. +    symbolList[numSymbols-1].next = NULL;
  219. +    topOfSymLinkList = NULL;
  220. + }
  221. + static
  222. + DspList * DirListing (Path)
  223. +    char    * Path;
  224. + {
  225. +    DspList        * dsp_ptr = NULL, * head_ptr, * tail_ptr, * p, * p1;
  226. +    DIR            * dirp;
  227. +    struct direct    * d;
  228. +    int            len, count = 0;
  229. +    char            path[MAXPATHLENGTH], s[MAXPATHLENGTH];
  230. +    struct stat        stat_buf;
  231. +    if (*Path == '\0')
  232. +    {
  233. +       strcpy (path, "/");
  234. +       if ((dirp = opendir (path)) == NULL) return (NULL);
  235. +    }
  236. +    else
  237. +    {
  238. +       strcpy (path, Path);
  239. +       if ((dirp = opendir (path)) == NULL) return (NULL);
  240. +       strcat (path, "/");
  241. +    }
  242. +    head_ptr = tail_ptr = NULL;
  243. +    while ((d = readdir (dirp)) != NULL)
  244. +    {
  245. +       len = strlen (d->d_name);
  246. +       if (len > 4 && (strcmp (".obj", &d->d_name[len-4]) == 0))
  247. +       {
  248. +          d->d_name[len-4] = '\0';
  249. +          dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  250. +          dsp_ptr->directory = FALSE;
  251. +          strcpy (dsp_ptr->itemstr, d->d_name);
  252. +       }
  253. +       else if (strcmp (d->d_name, ".") == 0)
  254. +          continue;
  255. +       else
  256. +       {
  257. +          sprintf (s, "%s%s", path, d->d_name);
  258. +          stat (s, &stat_buf);
  259. +          if (stat_buf.st_mode & S_IFDIR)
  260. +          {
  261. +             dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  262. +             dsp_ptr->directory = TRUE;
  263. +             strcat (d->d_name, "/");
  264. +             strcpy (dsp_ptr->itemstr, d->d_name);
  265. +          }
  266. +          else
  267. +             continue;
  268. +       }
  269. +       if (head_ptr == NULL)
  270. +          head_ptr = tail_ptr = dsp_ptr;
  271. +       else
  272. +       {
  273. +          p1 = NULL;
  274. +          for (p = head_ptr; p != NULL; p = p->next)
  275. +             if (LargerStr (d->d_name, p->itemstr))
  276. +                p1 = p;
  277. +             else
  278. +                break;
  279. +          dsp_ptr->next = p;
  280. +          if (p == NULL)
  281. +          {  /* dsp_ptr has the largest element */
  282. +             tail_ptr->next = dsp_ptr;
  283. +             tail_ptr = dsp_ptr;
  284. +          }
  285. +          else if (p1 == NULL)
  286. +             head_ptr = dsp_ptr;
  287. +          else
  288. +             p1->next = dsp_ptr;
  289. +       }
  290. +       count++;
  291. +    }
  292. +    closedir (dirp);
  293. +    numDirEntries = count;
  294. +    return (head_ptr);
  295. + }
  296. + static
  297. + void BuildDirList ()
  298. + {
  299. +    register int        i;
  300. +    register DspList    * dsp_ptr;
  301. +    if (topOfDirLinkList != NULL)
  302. +    {
  303. +       if (dirList != NULL) cfree (dirList);
  304. +       dirList = (DspList *) calloc (numDirEntries, sizeof (DspList));
  305. +       dsp_ptr = topOfDirLinkList;
  306. +       for (i = 0; i < numDirEntries; i++, dsp_ptr = dsp_ptr->next)
  307. +       {
  308. +          strcpy (dirList[i].itemstr, dsp_ptr->itemstr);
  309. +          strcpy (dirList[i].pathstr, dsp_ptr->pathstr);
  310. +          dirList[i].directory = dsp_ptr->directory;
  311. +          dirList[i].next = &dirList[i+1];
  312. +          cfree (dsp_ptr);
  313. +       }
  314. +       dirList[numDirEntries-1].next = NULL;
  315. +       topOfDirLinkList = NULL;
  316. +    }
  317. + }
  318.   void InitNames ()
  319.   {
  320. !    int        default_found = FALSE;
  321. !    char        * c_ptr, domain_str[20], sym_path[80];
  322.      XGCValues    values;
  323.   
  324. ***************
  325. *** 79,82 ****
  326. --- 361,367 ----
  327.   
  328.      *curDomainName = '\0';
  329. +    *curDomainPath = '\0';
  330. +    *curSymDir = '\0';
  331. +    strcpy (curDir, bootDir);
  332.   
  333.      if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME, "DoubleClickInterval")) !=
  334. ***************
  335. *** 85,90 ****
  336. --- 370,408 ----
  337.      else
  338.         doubleClickInterval = 300;
  339. +    if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME, "DefaultDomain")) != NULL)
  340. +    {
  341. +       sprintf (domain_str, "Domain%s", c_ptr);
  342. +       if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME, domain_str)) != NULL)
  343. +       {
  344. +          if (*c_ptr != '\0')
  345. +          {
  346. +             strcpy (curDomainName, c_ptr);
  347. +             sprintf (sym_path, "TGIF_%s", c_ptr);
  348. +             default_found = TRUE;
  349. +          }
  350. +       }
  351. +    }
  352. +    if (!default_found || (c_ptr = getenv (sym_path)) == NULL)
  353. +       ParseSymPath (".");
  354. +    else
  355. +       if (strlen (c_ptr) >= MAXPATHLENGTH-1)
  356. +          ParseSymPath (".");
  357. +       else 
  358. +          ParseSymPath (c_ptr);
  359. +    if ((topOfSymLinkList = SymbolListing ()) != NULL) BuildSymbolList ();
  360.   }
  361.   
  362. + void UpdateDirInfo ()
  363. + {
  364. +    if ((topOfDirLinkList = DirListing (curDir)) != NULL) BuildDirList ();
  365. + }
  366. + void UpdateSymInfo ()
  367. + {
  368. +    if ((topOfSymLinkList = SymbolListing ()) != NULL) BuildSymbolList ();
  369. + }
  370.   void CleanUpNames ()
  371.   {
  372. ***************
  373. *** 91,94 ****
  374. --- 409,415 ----
  375.      XFreeGC (mainDisplay, nameGC);
  376.      XFreeGC (mainDisplay, revNameGC);
  377. +    if (symbolList != NULL) cfree (symbolList);
  378. +    if (dirList != NULL) cfree (dirList);
  379.   }
  380.   
  381. ***************
  382. *** 145,149 ****
  383.      register int    i;
  384.      int        top, len, end, pixel;
  385. -    DspItem    * diptr;
  386.      XGCValues    values;
  387.   
  388. --- 466,469 ----
  389. ***************
  390. *** 181,188 ****
  391.   
  392.   static
  393. ! void RedrawNameBaseWindow (Str, str_start, button_start, W, H)
  394. !    char    * Str;
  395. !    int    str_start, button_start;
  396.   {
  397.      int    top = defaultFontAsc+2;
  398.   
  399. --- 501,537 ----
  400.   
  401.   static
  402. ! void RedrawNamePath (Path, X, Y)
  403. !    char    * Path;
  404. !    int    X, Y;
  405.   {
  406. +    int    len = strlen (Path), cursor_x, cursor_y;
  407. +    char    * c_ptr;
  408. +    cursor_y = Y-defaultFontAsc;
  409. +    XClearArea (mainDisplay, nameBaseWin, X, Y-defaultFontAsc,
  410. +          ITEM_LEN*defaultFontWidth+4, defaultFontHeight+4, False);
  411. +    XDrawRectangle (mainDisplay, nameBaseWin, nameGC, X, cursor_y-2,
  412. +          ITEM_LEN*defaultFontWidth+8, defaultFontHeight+4);
  413. +    if (len > ITEM_LEN)
  414. +    {
  415. +       c_ptr = &(Path[len-ITEM_LEN]);
  416. +       len = ITEM_LEN;
  417. +    }
  418. +    else
  419. +       c_ptr = Path;
  420. +    cursor_x = X+2+len*defaultFontWidth;
  421. +    XDrawString (mainDisplay, nameBaseWin, nameGC, X+2, Y, c_ptr, len);
  422. +    XDrawLine (mainDisplay, nameBaseWin, nameGC, cursor_x,
  423. +          cursor_y, cursor_x, cursor_y+defaultFontHeight);
  424. + }
  425. + static
  426. + void RedrawNameBaseWindow (Str, Path, str_start, path_start, button_start, W, H)
  427. +    char    * Str, * Path;
  428. +    int    str_start, path_start, button_start, W, H;
  429. + {
  430.      int    top = defaultFontAsc+2;
  431.   
  432. ***************
  433. *** 190,199 ****
  434.      XDrawString (mainDisplay, nameBaseWin, nameGC, str_start,
  435.            ROW_HEIGHT+top, Str, strlen(Str));
  436.   
  437. !    buttonBBox[0].lty = buttonBBox[1].lty = (ITEM_DSPED+4) * ROW_HEIGHT;
  438.      buttonBBox[0].ltx = button_start;
  439. !    DisplayButton (nameBaseWin, "OK", 8, &buttonBBox[0], BUTTON_NORMAL);
  440.      buttonBBox[1].ltx = buttonBBox[CONFIRM_YES].rbx + 1 + defaultFontWidth;
  441. !    DisplayButton (nameBaseWin, "CANCEL", 8, &buttonBBox[1],
  442.            BUTTON_NORMAL);
  443.   }
  444. --- 539,549 ----
  445.      XDrawString (mainDisplay, nameBaseWin, nameGC, str_start,
  446.            ROW_HEIGHT+top, Str, strlen(Str));
  447. +    RedrawNamePath (Path, path_start, 3*ROW_HEIGHT+top);
  448.   
  449. !    buttonBBox[0].lty = buttonBBox[1].lty = (ITEM_DSPED+6) * ROW_HEIGHT;
  450.      buttonBBox[0].ltx = button_start;
  451. !    DisplayButton (nameBaseWin, "OK", 8, &(buttonBBox[0]), BUTTON_NORMAL);
  452.      buttonBBox[1].ltx = buttonBBox[CONFIRM_YES].rbx + 1 + defaultFontWidth;
  453. !    DisplayButton (nameBaseWin, "CANCEL", 8, &(buttonBBox[1]),
  454.            BUTTON_NORMAL);
  455.   }
  456. ***************
  457. *** 213,221 ****
  458.         dsp_ptr[i] = c_ptr;
  459.         len = strlen (DLPtr->itemstr);
  460. !       for (j = len; j >= 0 && DLPtr->itemstr[j] != '/'; j--) ;
  461. !       if (j >= 0)
  462. !          strcpy (c_ptr, (&DLPtr->itemstr[j])+1);
  463.         else
  464.            strcpy (c_ptr, DLPtr->itemstr);
  465.         c_ptr += MAXPATHLENGTH;
  466.      }
  467. --- 563,577 ----
  468.         dsp_ptr[i] = c_ptr;
  469.         len = strlen (DLPtr->itemstr);
  470. !       if (!DLPtr->directory)
  471. !       {
  472. !          for (j = len; j >= 0 && DLPtr->itemstr[j] != '/'; j--) ;
  473. !          if (j >= 0)
  474. !             strcpy (c_ptr, (&(DLPtr->itemstr[j]))+1);
  475. !          else
  476. !             strcpy (c_ptr, DLPtr->itemstr);
  477. !       }
  478.         else
  479.            strcpy (c_ptr, DLPtr->itemstr);
  480.         c_ptr += MAXPATHLENGTH;
  481.      }
  482. ***************
  483. *** 343,362 ****
  484.   
  485.   static
  486. ! int Names (Str)
  487. !    char    * Str;
  488.   {
  489. !    int        x, y, pixel, button_widths, str_width, graph_width, w, h;
  490. !    int        str_start, button_start, graph_start, index;
  491. !    int        dsp_w, dsp_h;
  492. !    XEvent    input, ev;
  493. !    int        i, len, looping = TRUE, grabbed = FALSE;
  494. !    char        buf[80];
  495. !    XKeyEvent    * key_ev;
  496. !    XButtonEvent    * button_ev;
  497. !    KeySym    key_sym;
  498.      XComposeStatus    c_stat;
  499.      XSetWindowAttributes    win_attrs;
  500. !    int        win_x, win_y, win_w, win_h, win_d, win_brdr_w;
  501. !    Window    root_win;
  502.   
  503.      dsp_w = DisplayWidth (mainDisplay, mainScreen);
  504. --- 699,730 ----
  505.   
  506.   static
  507. ! int LargerStr (S1, S2)
  508. !    register char    * S1, * S2;
  509. !    /* returns TRUE if S1 > S2 */
  510.   {
  511. !    while (*S1 == *S2 && *S1 != '\0' && *S2 != '\0') { S1++; S2++; }
  512. !    return (*S1 > *S2);
  513. ! }
  514. ! static
  515. ! int DirNames (TopStr, SelStr)
  516. !    char    * TopStr, * SelStr;
  517. ! {
  518. !    int            pixel, button_widths, str_width, graph_width;
  519. !    int            str_start, button_start, graph_start, index;
  520. !    int            dsp_w, dsp_h, x, y, w, h, i, len, exposure = 0;
  521. !    XEvent        input, ev;
  522. !    int            looping = TRUE, changing, grabbed = FALSE, name_index;
  523. !    char            buf[80], name[MAXPATHLENGTH], full_name[MAXPATHLENGTH];
  524. !    char            dir_name[MAXPATHLENGTH], sel_str[MAXPATHLENGTH];
  525. !    XKeyEvent        * key_ev;
  526. !    XButtonEvent        * button_ev;
  527. !    KeySym        key_sym;
  528.      XComposeStatus    c_stat;
  529.      XSetWindowAttributes    win_attrs;
  530. !    int            win_x, win_y, win_w, win_h, win_d, win_brdr_w;
  531. !    Window        root_win;
  532. !    DspList        * dsp_ptr, * head_dsp_ptr;
  533.   
  534.      dsp_w = DisplayWidth (mainDisplay, mainScreen);
  535. ***************
  536. *** 365,369 ****
  537.      button_widths = ButtonWidth("OK", 8) + ButtonWidth("CANCEL", 8) +
  538.            defaultFontWidth;
  539. !    str_width = defaultFontWidth * strlen (Str);
  540.      graph_width = nameDspWinW + scrollBarW + 2 * brdrW;
  541.   
  542. --- 733,737 ----
  543.      button_widths = ButtonWidth("OK", 8) + ButtonWidth("CANCEL", 8) +
  544.            defaultFontWidth;
  545. !    str_width = defaultFontWidth * strlen (TopStr);
  546.      graph_width = nameDspWinW + scrollBarW + 2 * brdrW;
  547.   
  548. ***************
  549. *** 381,385 ****
  550.      }
  551.      button_start = (w - button_widths) / 2;
  552. !    h = (6 + ITEM_DSPED) * ROW_HEIGHT;
  553.   
  554.      win_x = (w > dsp_w) ? 0 : (dsp_w - w)/2;
  555. --- 749,753 ----
  556.      }
  557.      button_start = (w - button_widths) / 2;
  558. !    h = (8 + ITEM_DSPED) * ROW_HEIGHT;
  559.   
  560.      win_x = (w > dsp_w) ? 0 : (dsp_w - w)/2;
  561. ***************
  562. *** 393,397 ****
  563.   
  564.      if ((nameDspWin = XCreateSimpleWindow (mainDisplay, nameBaseWin, graph_start,
  565. !          3*ROW_HEIGHT, nameDspW, nameDspH, brdrW, myBorderPixel,
  566.            myBgPixel)) == 0)
  567.      { printf ("Could not create desired popup window!\n"); exit (-1); }
  568. --- 761,765 ----
  569.   
  570.      if ((nameDspWin = XCreateSimpleWindow (mainDisplay, nameBaseWin, graph_start,
  571. !          5*ROW_HEIGHT, nameDspW, nameDspH, brdrW, myBorderPixel,
  572.            myBgPixel)) == 0)
  573.      { printf ("Could not create desired popup window!\n"); exit (-1); }
  574. ***************
  575. *** 398,402 ****
  576.   
  577.      if ((nameScrollWin = XCreateSimpleWindow (mainDisplay, nameBaseWin,
  578. !          graph_start+nameDspWinW, 3*ROW_HEIGHT, scrollBarW, nameDspH,
  579.            brdrW, myBorderPixel, myBgPixel)) == 0)
  580.      { printf ("Could not create desired popup scroll window!\n"); exit (-1); }
  581. --- 766,770 ----
  582.   
  583.      if ((nameScrollWin = XCreateSimpleWindow (mainDisplay, nameBaseWin,
  584. !          graph_start+nameDspWinW, 5*ROW_HEIGHT, scrollBarW, nameDspH,
  585.            brdrW, myBorderPixel, myBgPixel)) == 0)
  586.      { printf ("Could not create desired popup scroll window!\n"); exit (-1); }
  587. ***************
  588. *** 419,425 ****
  589. --- 787,1122 ----
  590.            KeyPressMask | ButtonPressMask | ExposureMask);
  591.   
  592. +    strcpy (dir_name, curDir);
  593.      justClicked = FALSE;
  594.      while (looping)
  595.      {
  596. +       nameEntries = numDirEntries;
  597. +       if (topOfDirLinkList == NULL)
  598. +          nameDspPtr = MakeNameDspItemArray (nameEntries, dirList);
  599. +       else
  600. +          nameDspPtr = MakeNameDspItemArray (nameEntries, topOfDirLinkList);
  601. +       nameFirst = 0;
  602. +       nameMarked = 0;
  603. +       sprintf (full_name, "%s/", dir_name);
  604. +       name[0] = '\0';
  605. +       name_index = 0;
  606. +       if (exposure >= 3)
  607. +       {
  608. +          XClearWindow (mainDisplay, nameBaseWin);
  609. +          XClearWindow (mainDisplay, nameDspWin);
  610. +          XClearWindow (mainDisplay, nameScrollWin);
  611. +          RedrawNameBaseWindow (TopStr, full_name, str_start, graph_start,
  612. +                button_start, w, h);
  613. +          RedrawNameScrollWin ();
  614. +          RedrawDspWindow ();
  615. +       }
  616. +       changing = TRUE;
  617. +       while (changing)
  618. +       {
  619. +          XNextEvent (mainDisplay, &input);
  620. +          if (input.type == Expose)
  621. +          {
  622. +             if (input.xany.window == nameBaseWin)
  623. +             {
  624. +                RedrawNameBaseWindow (TopStr, full_name, str_start, graph_start,
  625. +                      button_start, w, h);
  626. +                exposure++;
  627. +             }
  628. +             else if (input.xany.window == nameScrollWin)
  629. +             {
  630. +                RedrawNameScrollWin ();
  631. +                exposure++;
  632. +             }
  633. +             else if (input.xany.window == nameDspWin)
  634. +             {
  635. +                RedrawDspWindow ();
  636. +                exposure++;
  637. +             }
  638. +             if (!grabbed)
  639. +             {
  640. +                XGrabKeyboard (mainDisplay, nameBaseWin, False,
  641. +                      GrabModeAsync, GrabModeAsync, CurrentTime);
  642. +                grabbed = TRUE;
  643. +             }
  644. +             continue;
  645. +          }
  646. +          else if (input.type == KeyPress)
  647. +          {
  648. +             key_ev = &(input.xkey);
  649. +             XLookupString (key_ev, buf, 80, &key_sym, &c_stat);
  650. +             if ((buf[0]=='\r' && (key_sym & 0xff)=='\r') ||
  651. +                 (buf[0]=='\n' && (key_sym & 0xff)=='\n'))
  652. +             {
  653. +                changing = FALSE;
  654. +                index = nameMarked;
  655. +             }
  656. +             else if (buf[0]=='\033' && (key_sym & 0xff)=='\033')
  657. +             {
  658. +                looping = FALSE;
  659. +                changing = FALSE;
  660. +                index = INVALID;
  661. +             }
  662. +             else if (buf[0] == '\b' || buf[0] == '\177')
  663. +             {
  664. +                if (name_index != 0)
  665. +                {
  666. +                   name[--name_index] = '\0';
  667. +                   sprintf (full_name, "%s/%s", dir_name, name);
  668. +                   for (i = 0; i < nameEntries; i++)
  669. +                      if (strncmp (nameDspPtr[i], name, name_index) == 0)
  670. +                         break;
  671. +                   if (i < nameEntries)
  672. +                   {
  673. +                      if (i < nameFirst)
  674. +                         nameFirst = i;
  675. +                      else if (i >= nameFirst+ITEM_DSPED)
  676. +                      {
  677. +                         if (i < nameEntries-ITEM_DSPED)
  678. +                            nameFirst = i;
  679. +                         else
  680. +                            nameFirst = nameEntries-ITEM_DSPED;
  681. +                      }
  682. +                      nameMarked = i;
  683. +                      RedrawNamePath (full_name, graph_start,
  684. +                            3*ROW_HEIGHT+defaultFontAsc+2);
  685. +                      RedrawNameScrollWin ();
  686. +                      RedrawDspWindow ();
  687. +                   }
  688. +                }
  689. +             }
  690. +             else if (key_sym>='\040' && key_sym<='\177')
  691. +             {
  692. +                if (buf[0] == '$')
  693. +                {
  694. +                   i = (nameEntries == 0) ? 0 : nameEntries-1;
  695. +                   strcpy (name, nameDspPtr[i]);
  696. +                }
  697. +                else
  698. +                {
  699. +                   name[name_index++] = buf[0];
  700. +                   name[name_index] = '\0';
  701. +                   for (i = 0; i < nameEntries; i++)
  702. +                      if (strncmp (nameDspPtr[i], name, name_index) == 0)
  703. +                         break;
  704. +                }
  705. +                if (i < nameEntries)
  706. +                {
  707. +                   if (buf[0] == '/')
  708. +                   {
  709. +                      changing = FALSE;
  710. +                      index = nameMarked = i;
  711. +                   }
  712. +                   else
  713. +                   {
  714. +                      if (i < nameFirst)
  715. +                         nameFirst = i;
  716. +                      else if (i >= nameFirst+ITEM_DSPED)
  717. +                      {
  718. +                         if (i < nameEntries-ITEM_DSPED)
  719. +                            nameFirst = i;
  720. +                         else
  721. +                            nameFirst = nameEntries-ITEM_DSPED;
  722. +                      }
  723. +                      nameMarked = i;
  724. +                      sprintf (full_name, "%s/%s", dir_name, name);
  725. +                      RedrawNamePath (full_name, graph_start,
  726. +                            3*ROW_HEIGHT+defaultFontAsc+2);
  727. +                      RedrawNameScrollWin ();
  728. +                      RedrawDspWindow ();
  729. +                   }
  730. +                }
  731. +                else
  732. +                   name[--name_index] = '\0';
  733. +             }
  734. +          }
  735. +          else if (input.type == ButtonPress)
  736. +          {
  737. +             button_ev = &(input.xbutton);
  738. +             if (button_ev->window == nameBaseWin)
  739. +             {
  740. +                if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[0]))
  741. +                {
  742. +                   changing = FALSE;
  743. +                   index = nameMarked;
  744. +                }
  745. +                else if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[1]))
  746. +                {
  747. +                   looping = FALSE;
  748. +                   changing = FALSE;
  749. +                   index = INVALID;
  750. +                }
  751. +             }
  752. +             else if (button_ev->window == nameScrollWin)
  753. +                NameScrollHandler (button_ev);
  754. +             else if (button_ev->window == nameDspWin)
  755. +             {
  756. +                if (NameDspHandler (button_ev) != INVALID)
  757. +                {
  758. +                   changing = FALSE;
  759. +                   index = nameMarked;
  760. +                }
  761. +                else if (nameMarked != INVALID)
  762. +                {
  763. +                   strcpy (name, nameDspPtr[nameMarked]);
  764. +                   sprintf (full_name, "%s/%s", dir_name, name);
  765. +                   RedrawNamePath (full_name, graph_start,
  766. +                         3*ROW_HEIGHT+defaultFontAsc+2);
  767. +                }
  768. +             }
  769. +          }
  770. +       }
  771. +       if (index != INVALID) strcpy (sel_str, nameDspPtr[index]);
  772. +       cfree (*nameDspPtr);
  773. +       cfree (nameDspPtr);
  774. +       if (index == INVALID) break;
  775. +       if (sel_str[strlen(sel_str)-1] == '/')
  776. +       {
  777. +          sel_str[strlen(sel_str)-1] = '\0';
  778. +          if (strcmp (sel_str, "..") == 0)
  779. +          {
  780. +             for (i = strlen(dir_name)-1; i>=0 && dir_name[i]!='/'; i--) ;
  781. +             if (i < 0)
  782. +                dir_name[0] = '\0';
  783. +             else
  784. +                dir_name[i] = '\0';
  785. +          }
  786. +          else
  787. +          {
  788. +             strcat (dir_name, "/");
  789. +             strcat (dir_name, sel_str);
  790. +          }
  791. +          dsp_ptr = topOfDirLinkList;
  792. +          for ( ; dsp_ptr != NULL; dsp_ptr = dsp_ptr->next) cfree (dsp_ptr);
  793. +          topOfDirLinkList = NULL;
  794. +          Msg ("Generating list of file names, please wait ...");
  795. +          if ((topOfDirLinkList = DirListing (dir_name)) == NULL)
  796. +          {
  797. +             *sel_str = '\0';
  798. +             break;
  799. +          }
  800. +          Msg ("");
  801. +       }
  802. +       else
  803. +          break;
  804. +    }
  805. +    if (grabbed) XUngrabKeyboard (mainDisplay, CurrentTime);
  806. +    sprintf (SelStr, "%s/%s", dir_name, sel_str);
  807. +    if (index == INVALID)
  808. +       DisplayButton (nameBaseWin, okCancelStr[1], 8, &buttonBBox[1],
  809. +             BUTTON_INVERT);
  810. +    else
  811. +       DisplayButton (nameBaseWin, okCancelStr[0], 8, &buttonBBox[0],
  812. +             BUTTON_INVERT);
  813. +    XDestroyWindow (mainDisplay, nameBaseWin);
  814. +    XSync (mainDisplay, FALSE);
  815. +    while (XCheckMaskEvent (mainDisplay, ExposureMask, &input)) ;
  816. +    return (index);
  817. + }
  818. + static
  819. + int ChooseAName (TopStr, SelStr)
  820. +    char    * TopStr, * SelStr;
  821. + {
  822. +    int            button_widths, str_width, graph_width;
  823. +    int            str_start, button_start, graph_start, index;
  824. +    int            dsp_w, dsp_h, x, y, w, h, i, len;
  825. +    XEvent        input, ev;
  826. +    int            changing = TRUE, grabbed = FALSE, name_index;
  827. +    char            buf[80], name[MAXPATHLENGTH];
  828. +    XKeyEvent        * key_ev;
  829. +    XButtonEvent        * button_ev;
  830. +    KeySym        key_sym;
  831. +    XComposeStatus    c_stat;
  832. +    XSetWindowAttributes    win_attrs;
  833. +    int            win_x, win_y, win_w, win_h, win_d, win_brdr_w;
  834. +    dsp_w = DisplayWidth (mainDisplay, mainScreen);
  835. +    dsp_h = DisplayHeight (mainDisplay, mainScreen);
  836. +    button_widths = ButtonWidth("OK", 8) + ButtonWidth("CANCEL", 8) +
  837. +          defaultFontWidth;
  838. +    str_width = defaultFontWidth * strlen (TopStr);
  839. +    graph_width = nameDspWinW + scrollBarW + 2 * brdrW;
  840. +    if (str_width > graph_width)
  841. +    {
  842. +       w = str_width + 4 * defaultFontWidth;
  843. +       str_start = 2 * defaultFontWidth;
  844. +       graph_start = (w - graph_width) / 2;
  845. +    }
  846. +    else
  847. +    {
  848. +       w = graph_width + 4 * defaultFontWidth;
  849. +       str_start = (w - str_width) / 2;
  850. +       graph_start = 2 * defaultFontWidth;
  851. +    }
  852. +    button_start = (w - button_widths) / 2;
  853. +    h = (8 + ITEM_DSPED) * ROW_HEIGHT;
  854. +    win_x = (w > dsp_w) ? 0 : (dsp_w - w)/2;
  855. +    win_y = (h > dsp_h) ? 0 : (dsp_h - h)/3;
  856. +    if ((nameBaseWin = XCreateSimpleWindow (mainDisplay, rootWindow,
  857. +          win_x, win_y, w, h, brdrW, myBorderPixel, myBgPixel)) == 0)
  858. +    { printf ("Could not create desired popup window!\n"); exit (-1); }
  859. +    XDefineCursor (mainDisplay, nameBaseWin, defaultCursor);
  860. +    if ((nameDspWin = XCreateSimpleWindow (mainDisplay, nameBaseWin, graph_start,
  861. +          5*ROW_HEIGHT, nameDspW, nameDspH, brdrW, myBorderPixel,
  862. +          myBgPixel)) == 0)
  863. +    { printf ("Could not create desired popup window!\n"); exit (-1); }
  864. +    if ((nameScrollWin = XCreateSimpleWindow (mainDisplay, nameBaseWin,
  865. +          graph_start+nameDspWinW, 5*ROW_HEIGHT, scrollBarW, nameDspH,
  866. +          brdrW, myBorderPixel, myBgPixel)) == 0)
  867. +    { printf ("Could not create desired popup scroll window!\n"); exit (-1); }
  868. +    win_attrs.save_under = True;
  869. +    XChangeWindowAttributes (mainDisplay, nameBaseWin, CWSaveUnder, &win_attrs);
  870. +    XSetTransientForHint (mainDisplay, nameBaseWin, mainWindow);
  871. +    XMapWindow (mainDisplay, nameBaseWin);
  872. +    XSelectInput (mainDisplay, nameBaseWin,
  873. +          KeyPressMask | ButtonPressMask | ExposureMask);
  874. +    XMapWindow (mainDisplay, nameDspWin);
  875. +    XSelectInput (mainDisplay, nameDspWin,
  876. +          KeyPressMask | ButtonPressMask | ExposureMask);
  877. +    XMapWindow (mainDisplay, nameScrollWin);
  878. +    XSelectInput (mainDisplay, nameScrollWin,
  879. +          KeyPressMask | ButtonPressMask | ExposureMask);
  880. +    justClicked = FALSE;
  881. +    Msg ("");
  882. +    name[0] = '\0';
  883. +    name_index = 0;
  884. +    nameMarked = INVALID;
  885. +    while (changing)
  886. +    {
  887.         XNextEvent (mainDisplay, &input);
  888.         if (input.type == Expose)
  889. ***************
  890. *** 426,430 ****
  891.         {
  892.            if (input.xany.window == nameBaseWin)
  893. !             RedrawNameBaseWindow (Str, str_start, button_start, w, h);
  894.            else if (input.xany.window == nameScrollWin)
  895.               RedrawNameScrollWin ();
  896. --- 1123,1128 ----
  897.         {
  898.            if (input.xany.window == nameBaseWin)
  899. !             RedrawNameBaseWindow (TopStr, name, str_start, graph_start,
  900. !                   button_start, w, h);
  901.            else if (input.xany.window == nameScrollWin)
  902.               RedrawNameScrollWin ();
  903. ***************
  904. *** 446,466 ****
  905.            XLookupString (key_ev, buf, 80, &key_sym, &c_stat);
  906.   
  907. !          if (buf[0] == '\r' || buf[0] == '\n')
  908.            {
  909. !             looping = FALSE;
  910.               index = nameMarked;
  911.            }
  912. !          else if (buf[0] == '\033')
  913.            {
  914. !             looping = FALSE;
  915.               index = INVALID;
  916.            }
  917.            else if (key_sym>='\040' && key_sym<='\177')
  918.            {
  919.               if (buf[0] == '$')
  920.                  i = (nameEntries == 0) ? 0 : nameEntries-1;
  921.               else
  922.                  for (i = 0; i < nameEntries; i++)
  923. !                   if (*nameDspPtr[i] == buf[0]) break;
  924.               if (i < nameEntries)
  925.               {
  926. --- 1144,1202 ----
  927.            XLookupString (key_ev, buf, 80, &key_sym, &c_stat);
  928.   
  929. !          if ((buf[0]=='\r' && (key_sym & 0xff)=='\r') ||
  930. !              (buf[0]=='\n' && (key_sym & 0xff)=='\n'))
  931.            {
  932. !             changing = FALSE;
  933.               index = nameMarked;
  934.            }
  935. !          else if (buf[0]=='\033' && (key_sym & 0xff)=='\033')
  936.            {
  937. !             changing = FALSE;
  938.               index = INVALID;
  939.            }
  940. +          else if (buf[0] == '\b' || buf[0] == '\177')
  941. +          {
  942. +             if (name_index != 0)
  943. +             {
  944. +                name[--name_index] = '\0';
  945. +                for (i = 0; i < nameEntries; i++)
  946. +                   if (strncmp (nameDspPtr[i], name, name_index) == 0)
  947. +                      break;
  948. +                if (i < nameEntries)
  949. +                {
  950. +                   if (i < nameFirst)
  951. +                      nameFirst = i;
  952. +                   else if (i >= nameFirst+ITEM_DSPED)
  953. +                   {
  954. +                      if (i < nameEntries-ITEM_DSPED)
  955. +                         nameFirst = i;
  956. +                      else
  957. +                         nameFirst = nameEntries-ITEM_DSPED;
  958. +                   }
  959. +                   nameMarked = i;
  960. +                   RedrawNamePath (name, graph_start,
  961. +                         3*ROW_HEIGHT+defaultFontAsc+2);
  962. +                   RedrawNameScrollWin ();
  963. +                   RedrawDspWindow ();
  964. +                }
  965. +             }
  966. +          }
  967.            else if (key_sym>='\040' && key_sym<='\177')
  968.            {
  969.               if (buf[0] == '$')
  970. +             {
  971.                  i = (nameEntries == 0) ? 0 : nameEntries-1;
  972. +                strcpy (name, nameDspPtr[i]);
  973. +             }
  974.               else
  975. +             {
  976. +                name[name_index++] = buf[0];
  977. +                name[name_index] = '\0';
  978.                  for (i = 0; i < nameEntries; i++)
  979. !                   if (strncmp (nameDspPtr[i], name, name_index) == 0)
  980. !                      break;
  981. !             }
  982.               if (i < nameEntries)
  983.               {
  984. ***************
  985. *** 475,481 ****
  986. --- 1211,1222 ----
  987.                  }
  988.                  nameMarked = i;
  989. +                RedrawNamePath (name, graph_start,
  990. +                      3*ROW_HEIGHT+defaultFontAsc+2);
  991.                  RedrawNameScrollWin ();
  992.                  RedrawDspWindow ();
  993.               }
  994. +             else
  995. +                name[--name_index] = '\0';
  996.            }
  997.         }
  998. ***************
  999. *** 487,491 ****
  1000.               if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[0]))
  1001.               {
  1002. !                looping = FALSE;
  1003.                  index = nameMarked;
  1004.               }
  1005. --- 1228,1232 ----
  1006.               if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[0]))
  1007.               {
  1008. !                changing = FALSE;
  1009.                  index = nameMarked;
  1010.               }
  1011. ***************
  1012. *** 492,496 ****
  1013.               else if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[1]))
  1014.               {
  1015. !                looping = FALSE;
  1016.                  index = INVALID;
  1017.               }
  1018. --- 1233,1237 ----
  1019.               else if (PointInBBox (button_ev->x, button_ev->y, buttonBBox[1]))
  1020.               {
  1021. !                changing = FALSE;
  1022.                  index = INVALID;
  1023.               }
  1024. ***************
  1025. *** 502,508 ****
  1026.               if (NameDspHandler (button_ev) != INVALID)
  1027.               {
  1028. !                looping = FALSE;
  1029.                  index = nameMarked;
  1030.               }
  1031.            }
  1032.         }
  1033. --- 1243,1256 ----
  1034.               if (NameDspHandler (button_ev) != INVALID)
  1035.               {
  1036. !                changing = FALSE;
  1037.                  index = nameMarked;
  1038.               }
  1039. +             else if (nameMarked != INVALID)
  1040. +             {
  1041. +                strcpy (name, nameDspPtr[nameMarked]);
  1042. +                name_index = strlen (name);
  1043. +                RedrawNamePath (name, graph_start,
  1044. +                      3*ROW_HEIGHT+defaultFontAsc+2);
  1045. +             }
  1046.            }
  1047.         }
  1048. ***************
  1049. *** 514,519 ****
  1050. --- 1262,1270 ----
  1051.               BUTTON_INVERT);
  1052.      else
  1053. +    {
  1054. +       strcpy (SelStr, nameDspPtr[index]);
  1055.         DisplayButton (nameBaseWin, okCancelStr[0], 8, &buttonBBox[0],
  1056.               BUTTON_INVERT);
  1057. +    }
  1058.   
  1059.      XDestroyWindow (mainDisplay, nameBaseWin);
  1060. ***************
  1061. *** 523,698 ****
  1062.   }
  1063.   
  1064. ! static
  1065. ! int    LargerStr (S1, S2)
  1066. !    register char    * S1, * S2;
  1067. !    /* returns TRUE if S1 > S2 */
  1068.   {
  1069. !    while (*S1 == *S2 && *S1 != '\0' && *S2 != '\0') { S1++; S2++; }
  1070.   
  1071. !    return (*S1 > *S2);
  1072.   }
  1073.   
  1074. ! static
  1075. ! DspList * DirListing (Path, Extension, Entries)
  1076. !    char    * Path, * Extension;
  1077. !    int    * Entries;
  1078.   {
  1079. !    DspList        * dsp_ptr = NULL, * head_ptr, * tail_ptr, * p, * p1;
  1080. !    DIR            * dirp;
  1081. !    struct direct    * d;
  1082. !    int            len, ext_len, count = 0;
  1083. !    char            ext[MAXPATHLENGTH];
  1084.   
  1085. !    if (*Path == '\0')
  1086.      {
  1087. !       if ((dirp = opendir (".")) == NULL) return (NULL);
  1088.      }
  1089.      else
  1090.      {
  1091. !       if ((dirp = opendir (Path)) == NULL) return (NULL);
  1092.      }
  1093.   
  1094. !    strcpy (ext, ".");
  1095. !    strcat (ext, Extension);
  1096. !    ext_len = strlen (ext);
  1097. !    head_ptr = tail_ptr = NULL;
  1098.   
  1099. !    while ((d = readdir (dirp)) != NULL)
  1100. !    {
  1101. !       len = strlen (d->d_name);
  1102. !       if (len > ext_len && (strcmp (ext, &d->d_name[len-ext_len]) == 0))
  1103. !       {
  1104. !          d->d_name[len-ext_len] = '\0';
  1105. !          dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  1106. !          strcpy (dsp_ptr->itemstr, d->d_name);
  1107. !          if (head_ptr == NULL)
  1108. !             head_ptr = tail_ptr = dsp_ptr;
  1109. !          else
  1110. !          {
  1111. !             p1 = NULL;
  1112. !             for (p = head_ptr; p != NULL; p = p->next)
  1113. !                if (LargerStr (d->d_name, p->itemstr))
  1114. !                   p1 = p;
  1115. !                else
  1116. !                   break;
  1117.   
  1118. !             dsp_ptr->next = p;
  1119. !             if (p == NULL)
  1120. !             {  /* dsp_ptr has the largest element */
  1121. !                tail_ptr->next = dsp_ptr;
  1122. !                tail_ptr = dsp_ptr;
  1123. !             }
  1124. !             else if (p1 == NULL)
  1125. !                head_ptr = dsp_ptr;
  1126. !             else
  1127. !                p1->next = dsp_ptr;
  1128. !          }
  1129. !          count++;
  1130.         }
  1131. !    }
  1132. !    closedir (dirp);
  1133. !    *Entries = count;
  1134. !    return (head_ptr);
  1135.   }
  1136.   
  1137. ! int SelectFileName (Extension, Str, SelStr)
  1138. !    char    * Extension, * Str, * SelStr;
  1139.   {
  1140. !    register int    i, index;
  1141. !    char        s[MAXPATHLENGTH], full_name[MAXPATHLENGTH];
  1142. !    DspList    * dsp_ptr;
  1143.   
  1144. !    sprintf (s, "Generating list of file names, please wait ...");
  1145. !    Msg (s);
  1146. !    strcpy (full_name, curDomainName);
  1147.   
  1148. !    if ((dsp_ptr = DirListing (curDomainName, Extension, &nameEntries)) == NULL)
  1149. !    {
  1150. !       strcpy (s, "No appropriate files to select from.");
  1151. !       Msg (s);
  1152. !       *SelStr = '\0';
  1153. !       return (INVALID);
  1154. !    }
  1155.   
  1156. !    nameDspPtr = MakeNameDspItemArray (nameEntries, dsp_ptr);
  1157. !    nameFirst = 0;
  1158. !    nameMarked = 0;
  1159.   
  1160. !    if ((index = Names (Str)) == INVALID)
  1161. !       *SelStr = '\0';
  1162. !    else
  1163. !       strcpy (SelStr, nameDspPtr[index]);
  1164.   
  1165. !    for ( ; dsp_ptr != NULL; dsp_ptr = dsp_ptr->next) cfree (dsp_ptr);
  1166. !    cfree (nameDspPtr[0]);
  1167. !    cfree (nameDspPtr);
  1168. !    s[0] = '\0';
  1169. !    Msg (s);
  1170. !    return (index);
  1171.   }
  1172.   
  1173.   static
  1174. ! DspList * DomainListing (Path, Entries)
  1175. !    char    * Path;
  1176.      int    * Entries;
  1177.   {
  1178. !    DspList        * dsp_ptr = NULL, * head_ptr, * tail_ptr, * p, * p1;
  1179. !    DIR            * dirp, * dp;
  1180. !    struct direct    * d;
  1181. !    struct stat        stat_buf;
  1182. !    int            count = 0;
  1183. !    char            path[255], s[255];
  1184.   
  1185. !    if (*Path == '\0')
  1186. !       strcpy (path, ".");
  1187. !    else
  1188. !       strcpy (path, Path);
  1189.   
  1190. !    if ((dirp = opendir (path)) == NULL) return (NULL);
  1191.   
  1192. -    strcat (path, "/");
  1193.      head_ptr = tail_ptr = NULL;
  1194. !    while ((d = readdir (dirp)) != NULL)
  1195.      {
  1196. !       strcpy (s, path);
  1197. !       strcat (s, d->d_name);
  1198. !       stat (s, &stat_buf);
  1199. !       if (stat_buf.st_mode & S_IFDIR)
  1200.         {
  1201. !          dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  1202. !          strcpy (dsp_ptr->itemstr, d->d_name);
  1203. !          if (head_ptr == NULL)
  1204. !             head_ptr = tail_ptr = dsp_ptr;
  1205. !          else
  1206. !          {
  1207. !             p1 = NULL;
  1208. !             for (p = head_ptr; p != NULL; p = p->next)
  1209. !                if (LargerStr (d->d_name, p->itemstr))
  1210. !                   p1 = p;
  1211. !                else
  1212. !                   break;
  1213.   
  1214. !             dsp_ptr->next = p;
  1215. !             if (p == NULL)
  1216. !             {  /* dsp_ptr has the largest element */
  1217. !                tail_ptr->next = dsp_ptr;
  1218. !                tail_ptr = dsp_ptr;
  1219. !             }
  1220. !             else if (p1 == NULL)
  1221. !                head_ptr = dsp_ptr;
  1222.               else
  1223. !                p1->next = dsp_ptr;
  1224.            }
  1225. !          count++;
  1226.         }
  1227.      }
  1228. -    closedir (dirp);
  1229. -    *Entries = count;
  1230.      return (head_ptr);
  1231.   }
  1232. --- 1274,1421 ----
  1233.   }
  1234.   
  1235. ! int SelectFileName (MsgStr, SelStr)
  1236. !    char    * MsgStr, * SelStr;
  1237.   {
  1238. !    int        index = INVALID, saved_num_dir_entries;
  1239. !    DspList    * dsp_ptr;
  1240.   
  1241. !    saved_num_dir_entries = numDirEntries;
  1242. !    if ((index = DirNames (MsgStr, SelStr)) == INVALID)
  1243. !    {
  1244. !       numDirEntries = saved_num_dir_entries;
  1245. !       dsp_ptr = topOfDirLinkList;
  1246. !       for ( ; dsp_ptr != NULL; dsp_ptr = dsp_ptr->next) cfree (dsp_ptr);
  1247. !       topOfDirLinkList = NULL;
  1248. !       *SelStr = '\0';
  1249. !       return (INVALID);
  1250. !    }
  1251. !    BuildDirList ();
  1252. !    Msg ("");
  1253. !    return (index);
  1254.   }
  1255.   
  1256. ! int SelectSymbolName (SelSymName, PathName)
  1257. !    char    * SelSymName, * PathName;
  1258.   {
  1259. !    register int    i, index = INVALID;
  1260. !    char        s[MAXPATHLENGTH], msg[MAXSTRING];
  1261. !    DspList    * dsp_ptr;
  1262.   
  1263. !    sprintf (s,
  1264. !          "Generating a list of symbol names in '%s' domain, please wait ...",
  1265. !          curDomainName);
  1266. !    Msg (s);
  1267. !    nameEntries = numSymbols;
  1268. !    nameDspPtr = MakeNameDspItemArray (nameEntries, symbolList);
  1269. !    nameFirst = 0;
  1270. !    nameMarked = 0;
  1271. !    sprintf (msg, "Please select a symbol to INSTANTIATE in the '%s' domain ...",
  1272. !          curDomainName);
  1273. !    if ((index = ChooseAName (msg, SelSymName)) == INVALID)
  1274.      {
  1275. !       *SelSymName = '\0';
  1276. !       *PathName = '\0';
  1277.      }
  1278.      else
  1279.      {
  1280. !       strcpy (SelSymName, nameDspPtr[index]);
  1281. !       strcpy (PathName, symbolList[index].pathstr);
  1282.      }
  1283. +    cfree (*nameDspPtr);
  1284. +    cfree (nameDspPtr);
  1285.   
  1286. !    Msg ("");
  1287. !    return (index);
  1288. ! }
  1289.   
  1290. ! int GetSymbolPath (SymName, PathName)
  1291. !    char    * SymName, * PathName;
  1292. ! {
  1293. !    register int    i;
  1294.   
  1295. !    for (i = 0; i < numSymbols; i++)
  1296. !       if (strcmp (SymName, symbolList[i].itemstr) == 0)
  1297. !       {
  1298. !          strcpy (PathName, symbolList[i].pathstr);
  1299. !          return (TRUE);
  1300.         }
  1301. !    return (FALSE);
  1302.   }
  1303.   
  1304. ! int NameInCurDir (FileName)
  1305. !    char    * FileName;
  1306.   {
  1307. !    register int    i;
  1308.   
  1309. !    for (i = 0; i < numDirEntries; i++)
  1310. !       if (dirList[i].directory && strcmp (FileName, dirList[i].itemstr) == 0)
  1311. !          return (TRUE);
  1312.   
  1313. !    return (FALSE);
  1314. ! }
  1315.   
  1316. ! int DirInSymPath (DirName)
  1317. !    char    * DirName;
  1318. ! {
  1319. !    register int    i;
  1320.   
  1321. !    for (i = 0; i < symPathNumEntries; i++)
  1322. !       if (strcmp (DirName, symPath[i]) == 0)
  1323. !          return (TRUE);
  1324.   
  1325. !    return (FALSE);
  1326.   }
  1327.   
  1328.   static
  1329. ! DspList * DomainListing (Entries)
  1330.      int    * Entries;
  1331.   {
  1332. !    register int    i, default_index = 0;
  1333. !    char        s[MAXSTRING], * c_ptr;
  1334. !    DspList    * dsp_ptr = NULL, * head_ptr, * tail_ptr, * p, * p1;
  1335.   
  1336. !    if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME, "MaxDomains")) == NULL)
  1337. !       return (NULL);
  1338.   
  1339. !    *Entries = atoi (c_ptr);
  1340.   
  1341.      head_ptr = tail_ptr = NULL;
  1342. !    for (i = 0; i < *Entries; i++)
  1343.      {
  1344. !       sprintf (s, "Domain%1d", i);
  1345. !       if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME, s)) == NULL)
  1346.         {
  1347. !          for ( ; head_ptr != NULL; head_ptr = head_ptr->next) cfree (head_ptr);
  1348. !          return (NULL);
  1349. !       }
  1350.   
  1351. !       dsp_ptr = (DspList *) calloc (1, sizeof(DspList));
  1352. !       strcpy (dsp_ptr->itemstr, c_ptr);
  1353. !       if (head_ptr == NULL)
  1354. !          head_ptr = tail_ptr = dsp_ptr;
  1355. !       else
  1356. !       {
  1357. !          p1 = NULL;
  1358. !          for (p = head_ptr; p != NULL; p = p->next)
  1359. !             if (LargerStr (dsp_ptr->itemstr, p->itemstr))
  1360. !                p1 = p;
  1361.               else
  1362. !                break;
  1363. !          dsp_ptr->next = p;
  1364. !          if (p == NULL)
  1365. !          {  /* dsp_ptr has the largest element */
  1366. !             tail_ptr->next = dsp_ptr;
  1367. !             tail_ptr = dsp_ptr;
  1368.            }
  1369. !          else if (p1 == NULL)
  1370. !             head_ptr = dsp_ptr;
  1371. !          else
  1372. !             p1->next = dsp_ptr;
  1373.         }
  1374.      }
  1375.      return (head_ptr);
  1376.   }
  1377. ***************
  1378. *** 701,712 ****
  1379.      char    * SelStr;
  1380.   {
  1381. !    register int        i, index;
  1382. !    char            s[MAXPATHLENGTH];
  1383. !    DspList        * dsp_ptr;
  1384.   
  1385.      Msg ("Generating list of domain names, please wait ...");
  1386.   
  1387. !    if ((dsp_ptr = DomainListing (curDomainName, &nameEntries)) == NULL)
  1388.      {
  1389.         *SelStr = '\0';
  1390.         return (INVALID);
  1391. --- 1424,1436 ----
  1392.      char    * SelStr;
  1393.   {
  1394. !    int        index;
  1395. !    char        s[MAXPATHLENGTH];
  1396. !    DspList    * dsp_ptr;
  1397.   
  1398.      Msg ("Generating list of domain names, please wait ...");
  1399.   
  1400. !    if ((dsp_ptr = DomainListing (&nameEntries)) == NULL)
  1401.      {
  1402. +       Msg ("No domain names found.");
  1403.         *SelStr = '\0';
  1404.         return (INVALID);
  1405. ***************
  1406. *** 717,721 ****
  1407.      nameMarked = 0;
  1408.   
  1409. !    if ((index = Names ("PLEASE SELECT NEW DOMAIN ...")) == INVALID)
  1410.         *SelStr = '\0';
  1411.      else
  1412. --- 1441,1445 ----
  1413.      nameMarked = 0;
  1414.   
  1415. !    if ((index = ChooseAName ("Please select a new DOMAIN ...", "")) == INVALID)
  1416.         *SelStr = '\0';
  1417.      else
  1418. ***************
  1419. *** 730,732 ****
  1420. --- 1454,1481 ----
  1421.   
  1422.      return (index);
  1423. + }
  1424. + void SetCurDir (FileName)
  1425. +    char    * FileName;
  1426. + {
  1427. +    register int    i;
  1428. +    char        file_name[MAXPATHLENGTH];
  1429. +    strcpy (file_name, FileName);
  1430. +    for (i = strlen(file_name)-1; i>=0 && file_name[i]!='/'; i--) ;
  1431. +    if (i < 0)
  1432. +    {
  1433. +       TwoLineMsg ("Error:  No '/' found in SetCurDir ().",
  1434. +                   "        curDir set to '.'.");
  1435. +       strcpy (curDir, ".");
  1436. +       strcpy (curFileName, FileName);
  1437. +    }
  1438. +    else
  1439. +    {
  1440. +       strcpy (curFileName, &file_name[i+1]);
  1441. +       file_name[i] = '\0';
  1442. +       strcpy (curDir, file_name);
  1443. +    }
  1444.   }
  1445. ---------------------------------> cut here <---------------------------------
  1446. -- 
  1447. Bill Cheng // UCLA Computer Science Department // (213) 206-7135
  1448. 3277 Boelter Hall // Los Angeles, California 90024 // USA
  1449. william@CS.UCLA.EDU      ...!{uunet|ucbvax}!cs.ucla.edu!william
  1450.  
  1451. --
  1452. Dan Heller
  1453. ------------------------------------------------
  1454. O'Reilly && Associates               Zyrcom Inc
  1455. Senior Writer                   President
  1456. argv@ora.com            argv@zipcode.com
  1457.